{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import bayes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 准备数据:从文本中构建词向量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['how', 'cute', 'love', 'take', 'has', 'flea', 'so', 'ate', 'maybe', 'him', 'help', 'food', 'my', 'garbage', 'licks', 'is', 'not', 'buying', 'park', 'I', 'dalmation', 'quit', 'please', 'problems', 'stupid', 'posting', 'worthless', 'mr', 'steak', 'dog', 'to', 'stop']\n",
      "[0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0]\n"
     ]
    }
   ],
   "source": [
    "listOPosts, listClasses = bayes.loadDataSet()\n",
    "myVocabList = bayes.createVocabList(listOPosts)\n",
    "print(myVocabList)\n",
    "testVector = bayes.setOfWords2Vec(myVocabList, listOPosts[0])\n",
    "print(testVector)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练算法:从词向量计算概率"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# $p(c_i|w) = \\frac{p(c_i|w)p(c_i)}{p(w)}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0], [0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0]]\n"
     ]
    }
   ],
   "source": [
    "trainMat = []\n",
    "for postinDoc in listOPosts:\n",
    "    trainMat.append(bayes.setOfWords2Vec(myVocabList, postinDoc))\n",
    "print(trainMat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0, 1, 0, 1, 0, 1]\n"
     ]
    }
   ],
   "source": [
    "print(listClasses)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0.  0.  0.  0.  0.  0.  1.  1.  1.  1.  0.  0.  1.  0.  0.  1.  0.  0.\n",
      "  0.  0.  0.  0.  0.  0.  0.  0.  0.  1.  0.  1.  0.  0.]\n",
      "8.0\n",
      "[ 0.  1.  1.  1.  0.  0.  1.  1.  1.  1.  0.  0.  1.  0.  1.  2.  0.  0.\n",
      "  0.  0.  0.  0.  0.  0.  0.  0.  0.  1.  0.  1.  0.  0.]\n",
      "13.0\n",
      "[ 0.  1.  1.  2.  0.  0.  1.  2.  1.  1.  0.  0.  1.  0.  1.  3.  0.  0.\n",
      "  1.  0.  0.  0.  1.  0.  0.  0.  1.  1.  0.  1.  0.  0.]\n",
      "19.0\n"
     ]
    }
   ],
   "source": [
    "p0V, p1V, pAb = bayes.trainNB0(trainMat, listClasses)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0.125       0.          0.04166667  0.04166667  0.04166667  0.\n",
      "  0.04166667  0.04166667  0.04166667  0.04166667  0.04166667  0.04166667\n",
      "  0.04166667  0.04166667  0.04166667  0.          0.04166667  0.04166667\n",
      "  0.04166667  0.          0.04166667  0.          0.04166667  0.08333333\n",
      "  0.          0.          0.04166667  0.          0.04166667  0.          0.\n",
      "  0.        ]\n"
     ]
    }
   ],
   "source": [
    "print(p0V)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0.          0.05263158  0.          0.          0.          0.05263158\n",
      "  0.05263158  0.          0.          0.          0.          0.          0.\n",
      "  0.10526316  0.05263158  0.15789474  0.          0.          0.\n",
      "  0.05263158  0.          0.05263158  0.          0.05263158  0.05263158\n",
      "  0.05263158  0.          0.05263158  0.          0.05263158  0.05263158\n",
      "  0.10526316]\n"
     ]
    }
   ],
   "source": [
    "print(p1V)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 测试算法：根据现实情况修改分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\anaconda\\lib\\site-packages\\ipykernel_launcher.py:7: RuntimeWarning: divide by zero encountered in log10\n",
      "  import sys\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0xd416f49320>]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xd416bb4390>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import *\n",
    "\n",
    "x = np.arange(0.0, 0.5, 0.02)\n",
    "y1 = np.log10(x)\n",
    "\n",
    "plt.figure()\n",
    "plt.subplot(111)\n",
    "plt.plot(x, y1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['love', 'my', 'dalmation'] classified as:  0\n",
      "['stupid', 'garbage'] classified as:  1\n"
     ]
    }
   ],
   "source": [
    "bayes.testingNB()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0]\n"
     ]
    }
   ],
   "source": [
    "testEntry = ['love', 'my', 'dalmation']\n",
    "thisDoc = array(bayes.setOfWords2Vec(myVocabList, testEntry))\n",
    "print(thisDoc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 测试算法：使用朴素贝叶斯进行交叉验证，分类器的修正在第七章会有"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "classification error ['scifinance', 'now', 'automatically', 'generates', 'gpu', 'enabled', 'pricing', 'risk', 'model', 'source', 'code', 'that', 'runs', '300x', 'faster', 'than', 'serial', 'code', 'using', 'new', 'nvidia', 'fermi', 'class', 'tesla', 'series', 'gpu', 'scifinance', 'derivatives', 'pricing', 'and', 'risk', 'model', 'development', 'tool', 'that', 'automatically', 'generates', 'and', 'gpu', 'enabled', 'source', 'code', 'from', 'concise', 'high', 'level', 'model', 'specifications', 'parallel', 'computing', 'cuda', 'programming', 'expertise', 'required', 'scifinance', 'automatic', 'gpu', 'enabled', 'monte', 'carlo', 'pricing', 'model', 'source', 'code', 'generation', 'capabilities', 'have', 'been', 'significantly', 'extended', 'the', 'latest', 'release', 'this', 'includes']\n",
      "classification error ['yeah', 'ready', 'may', 'not', 'here', 'because', 'jar', 'jar', 'has', 'plane', 'tickets', 'germany', 'for']\n",
      "the error rate is:  0.2\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\anaconda\\lib\\re.py:212: FutureWarning: split() requires a non-empty pattern match.\n",
      "  return _compile(pattern, flags).split(string, maxsplit)\n"
     ]
    }
   ],
   "source": [
    "#随机抽取10个做测试集，因此每次训练结果不同\n",
    "bayes.spamTest()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 绘制交叉验证错误率图像"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\anaconda\\lib\\re.py:212: FutureWarning: split() requires a non-empty pattern match.\n",
      "  return _compile(pattern, flags).split(string, maxsplit)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "classification error ['scifinance', 'now', 'automatically', 'generates', 'gpu', 'enabled', 'pricing', 'risk', 'model', 'source', 'code', 'that', 'runs', '300x', 'faster', 'than', 'serial', 'code', 'using', 'new', 'nvidia', 'fermi', 'class', 'tesla', 'series', 'gpu', 'scifinance', 'derivatives', 'pricing', 'and', 'risk', 'model', 'development', 'tool', 'that', 'automatically', 'generates', 'and', 'gpu', 'enabled', 'source', 'code', 'from', 'concise', 'high', 'level', 'model', 'specifications', 'parallel', 'computing', 'cuda', 'programming', 'expertise', 'required', 'scifinance', 'automatic', 'gpu', 'enabled', 'monte', 'carlo', 'pricing', 'model', 'source', 'code', 'generation', 'capabilities', 'have', 'been', 'significantly', 'extended', 'the', 'latest', 'release', 'this', 'includes']\n",
      "the error rate is:  0.1\n",
      "[ 1.   0.1]\n",
      "the error rate is:  0.0\n",
      "[ 2.  0.]\n",
      "classification error ['scifinance', 'now', 'automatically', 'generates', 'gpu', 'enabled', 'pricing', 'risk', 'model', 'source', 'code', 'that', 'runs', '300x', 'faster', 'than', 'serial', 'code', 'using', 'new', 'nvidia', 'fermi', 'class', 'tesla', 'series', 'gpu', 'scifinance', 'derivatives', 'pricing', 'and', 'risk', 'model', 'development', 'tool', 'that', 'automatically', 'generates', 'and', 'gpu', 'enabled', 'source', 'code', 'from', 'concise', 'high', 'level', 'model', 'specifications', 'parallel', 'computing', 'cuda', 'programming', 'expertise', 'required', 'scifinance', 'automatic', 'gpu', 'enabled', 'monte', 'carlo', 'pricing', 'model', 'source', 'code', 'generation', 'capabilities', 'have', 'been', 'significantly', 'extended', 'the', 'latest', 'release', 'this', 'includes']\n",
      "the error rate is:  0.1\n",
      "[ 3.   0.1]\n",
      "classification error ['scifinance', 'now', 'automatically', 'generates', 'gpu', 'enabled', 'pricing', 'risk', 'model', 'source', 'code', 'that', 'runs', '300x', 'faster', 'than', 'serial', 'code', 'using', 'new', 'nvidia', 'fermi', 'class', 'tesla', 'series', 'gpu', 'scifinance', 'derivatives', 'pricing', 'and', 'risk', 'model', 'development', 'tool', 'that', 'automatically', 'generates', 'and', 'gpu', 'enabled', 'source', 'code', 'from', 'concise', 'high', 'level', 'model', 'specifications', 'parallel', 'computing', 'cuda', 'programming', 'expertise', 'required', 'scifinance', 'automatic', 'gpu', 'enabled', 'monte', 'carlo', 'pricing', 'model', 'source', 'code', 'generation', 'capabilities', 'have', 'been', 'significantly', 'extended', 'the', 'latest', 'release', 'this', 'includes']\n",
      "classification error ['benoit', 'mandelbrot', '1924', '2010', 'benoit', 'mandelbrot', '1924', '2010', 'wilmott', 'team', 'benoit', 'mandelbrot', 'the', 'mathematician', 'the', 'father', 'fractal', 'mathematics', 'and', 'advocate', 'more', 'sophisticated', 'modelling', 'quantitative', 'finance', 'died', '14th', 'october', '2010', 'aged', 'wilmott', 'magazine', 'has', 'often', 'featured', 'mandelbrot', 'his', 'ideas', 'and', 'the', 'work', 'others', 'inspired', 'his', 'fundamental', 'insights', 'you', 'must', 'logged', 'view', 'these', 'articles', 'from', 'past', 'issues', 'wilmott', 'magazine']\n",
      "the error rate is:  0.2\n",
      "[ 4.   0.2]\n",
      "the error rate is:  0.0\n",
      "[ 5.  0.]\n",
      "classification error ['home', 'based', 'business', 'opportunity', 'knocking', 'your', 'door', 'don抰', 'rude', 'and', 'let', 'this', 'chance', 'you', 'can', 'earn', 'great', 'income', 'and', 'find', 'your', 'financial', 'life', 'transformed', 'learn', 'more', 'here', 'your', 'success', 'work', 'from', 'home', 'finder', 'experts']\n",
      "classification error ['linkedin', 'kerry', 'haloney', 'requested', 'add', 'you', 'connection', 'linkedin', 'peter', 'like', 'add', 'you', 'professional', 'network', 'linkedin', 'kerry', 'haloney']\n",
      "the error rate is:  0.2\n",
      "[ 6.   0.2]\n",
      "classification error ['yeah', 'ready', 'may', 'not', 'here', 'because', 'jar', 'jar', 'has', 'plane', 'tickets', 'germany', 'for']\n",
      "the error rate is:  0.1\n",
      "[ 7.   0.1]\n",
      "classification error ['benoit', 'mandelbrot', '1924', '2010', 'benoit', 'mandelbrot', '1924', '2010', 'wilmott', 'team', 'benoit', 'mandelbrot', 'the', 'mathematician', 'the', 'father', 'fractal', 'mathematics', 'and', 'advocate', 'more', 'sophisticated', 'modelling', 'quantitative', 'finance', 'died', '14th', 'october', '2010', 'aged', 'wilmott', 'magazine', 'has', 'often', 'featured', 'mandelbrot', 'his', 'ideas', 'and', 'the', 'work', 'others', 'inspired', 'his', 'fundamental', 'insights', 'you', 'must', 'logged', 'view', 'these', 'articles', 'from', 'past', 'issues', 'wilmott', 'magazine']\n",
      "the error rate is:  0.1\n",
      "[ 8.   0.1]\n",
      "the error rate is:  0.0\n",
      "[ 9.  0.]\n",
      "the error rate is:  0.0\n",
      "[ 10.   0.]\n",
      "11\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "k = 1\n",
    "i = 0\n",
    "errors = []\n",
    "xylabel = np.zeros((10,2))\n",
    "while(k <= 10):\n",
    "    a = bayes.spamTest()\n",
    "    errors.append(a)\n",
    "    xylabel[i] = np.tile([k, a],(1,1))\n",
    "    print(xylabel[i])\n",
    "    i += 1\n",
    "    k += 1\n",
    "print(k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "average errorRate is : 0.08\n"
     ]
    }
   ],
   "source": [
    "print('average errorRate is :', sum(errors)/len(errors))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nbWoIMh1WHt/b63JUS9/GjRv53Oc+x/ve9z7q6+u59dZb6enpmfe4b3zjG/zZn/0Z9fX1vP7669x/\n//3zHjOXP//zP+eTn/wk11577Xkjwm688UbeeOONc53t9913H5OTk9TX17N582buu+++i37NC5FY\nplrKtm7dqrawVfo6dnKU9/6PH/HxHZfxhzdcCsAN//NHXF61nH/47Xe7HJ07hsen2PyZJ/kvt9by\nxzfXoKrc+sUfU1qYy8Mf+RW3w3PU/v37k97Gb2b/uYrIq6q6db5j7YrEeF5LW+TbXmN91blttQF/\nRs8lORB977ErEhGhqT7IL46cpO+MVcU1qWWJxHheS1s3V65dwZqSgnPb6ir9vHVilLHJxCZ6LTUH\n+oYBqAv4z21rbKhCFR5rm7+ZxXjT5z//ea644orzbp///OfdDmteVkbeeNrBgWH2dZ/hvsbz633W\nBvxMh5VDAyNsDC53KTr3tPeFyM/JOi+5XlpexMaq5TS3dfP777m4cuDGXZ/+9Kf59Kc/7XYYC2ZX\nJMbTWlp7EIHbt1Sdtz3TR2519IWoqfDjyzq/alBTQ5DXjp7m2MnROY5cGjKhbzeVFvvztERiPEtV\naW7rZlt1CZXF+ec9V11aSHaWZGw/SXtviJrAO+fQxPqRHtuzdJu38vPzOXHihCWTJIktbJWfnz//\nznOwpi3jWe19ITr7h/nL979z/mludhbrywvpyMAhwKdHJ+gPjZ/XPxKzpqSAK9asoLm1mz+4/lIX\nonPe6tWr6erqwqp6J09sqd2LZYnEeFZLaw++LGHn5spZn68N+GntOp3iqNzXEe1oj43YmqmpIchf\ntrzBoYFh1pcvvZn/OTk5F70krHGGNW0ZT4o1a11zaSllRXmz7lMX8HPs5FlGMmwtjlhz3mxXJBDp\nTxJ5e9i0MU6zRGI8ac/xId46MUpTfXDOfWLfyA/0D6cqLE/o6A3hz8umqnj2Nu3K4ny2VZdYaXmT\nMpZIjCe1tPWQ4xNu2zR7sxZEmraAjOsnae+LdLRfaJ3tpvoqDvQPZ3wZGZMalkiM54TDSktrN9fV\nlF9wfY21JQXkZWdl1BBgVeVAX+jc8Oe57NxSRZbYglcmNSyRGM957dgpuofGaGyouuB+viyhJlCU\nUUOAB4bHOTU6ee5qbC5lRXlcc2kZLW3dNkzWOM7RRCIiO0SkXUQ6ReQTszx/nYj8UkSmROQDcdtv\n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\njDHGLMr/D3V9Zh9zpx3xAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x410ef1bbe0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "y1, y2 = xylabel[:,0], xylabel[:,1]\n",
    "plt.plot(y1, y2, label='error_rate')\n",
    "plt.xlabel('k')\n",
    "plt.ylabel('errorRate')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# 从个人广告中获取区域倾向"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.数据收集：导入RSS源"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import feedparser\n",
    "ny = feedparser.parse('https://newyork.craigslist.org/search/stp?format=rss')\n",
    "sf = feedparser.parse('https://sfbay.craigslist.org/search/stp?format=rss')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "the error rate is:  0.25\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\anaconda\\lib\\re.py:212: FutureWarning: split() requires a non-empty pattern match.\n",
      "  return _compile(pattern, flags).split(string, maxsplit)\n"
     ]
    }
   ],
   "source": [
    "vocabList, pSF, pNY = bayes.localWords(ny, sf)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
